package edu.ccut.saturn.component.impl.directory;

import java.util.List;

import org.osgi.framework.Bundle;

import edu.ccut.saturn.component.ComponentFactory;
import edu.ccut.saturn.component.IBundleInfo;
import edu.ccut.saturn.component.IResourceInfo;

/**
 * 代表模块（module）类型文件夹的路径资源的实现类。模块（module）类型文件夹位于bundle的根路径下，
 * 文件夹内可以放置其它类型的文件夹资源。提供了load方法可以加载内部的其它类型的文件夹资源。
 * 
 * @author 温建
 * @version 1.0 2008.8.29
 * 
 * @see AbstractDirectoryInfo
 * @see IBundleInfo
 * @see IResourceInfo
 * @see ComponentFactory
 * 
 */
public class SaturnModuleDirectoryInfo extends AbstractDirectoryInfo {

	public SaturnModuleDirectoryInfo() {
		super(SATURN_DIRECTORY_TYPE_MODULE);
	}

	/**
	 * 模块类型的文件夹加载内部资源的方法。
	 * 首先通过<code>ComponentFactory</code>获得文件夹内部的资源实例，然后调用资源的load方法来加载资源。
	 * 
	 * @param bundle
	 *            加载的bundle对象实例
	 * @param bundleInfo
	 *            保存bundle的加载信息
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void load(Bundle bundle, IBundleInfo bundleInfo) {
		logger.debug("start load module! the path is ["
				+ super.getDirectoryPath() + "]");

		List<IResourceInfo> resourceInfos = null;
		resourceInfos = ComponentFactory.getDirectoryInfos(bundle, super
				.getDirectoryPath());

		if (resourceInfos != null) {

			for (IResourceInfo resourceInfo : resourceInfos) {

				try {

					if (resourceInfo != null) {
						resourceInfo.load(bundle, bundleInfo);
					}

				} catch (Exception e) {
					logger.error("load module failed! the path is \""
							+ super.getDirectoryPath() + "\" in bundle ["
							+ bundle.getSymbolicName() + "]", e);
				}
			}
		}
		logger.debug("end load module! the path is ["
				+ super.getDirectoryPath() + "]");
	}
}
